﻿<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="cmd.css" rel="stylesheet" type="text/css">
<title>内存变量应用实例菜单</title>
</head>

<body>
<p><span class="bat">debug </span><strong>off</strong><br>
  <span class="bat">timeout</span> <strong>0</strong><br>
<span class="bat">default</span><strong> 0</strong></p>
<p><span class="Options">title</span> <strong>RUN IMG PE2003 </strong><br>
  <span class="bat">map</span> <span class="Options">--mem</span><strong> /COOLG/EXT.IMG.GZ </strong><span class="bat">(fd0)</span><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;将EXT.IMG.GZ 文件仿真为第一软驱</span><br>
  <span class="bat">map</span> <span class="Options">--hook</span><br>
  <span class="bat">insmod</span> <strong>(fd0)/GRUB/FAT</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;使用indmod命令将指定位置（第一软驱上的/BOOT/目录）的外部命令fat加载到内存</span><br>
  <span class="bat">pause</span> <span class="Options">--wait=</span><strong>0 Copy Net Drivers...</strong><br>
  <span class="bat">FAT</span> <span class="Options">copy</span> <strong>/COOLG/NET.CAB (fd0)/</strong><br>
  <span class="Notes">#使用外部命令fat将当前设备/COOLG/目录下的NET.CAB文件复制到第一软驱的根目录下</span><br>
  <span class="bat">cat</span> <span class="Options">--length=</span><strong>0 /COOLG/OEM_NET.CAB</strong> <span class="Options">&amp;&amp; </span><span class="bat">FAT</span> <span class="Options">copy</span><strong> /COOLG/OEM_NET.CAB (fd0)/</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;检测当前设备/COOLG/目录下是否存在OEM_NET.CAB文件，如果存在的话也将其复制到第一软驱根目录<br>
  # &nbsp;&nbsp;&nbsp;0.4.5版grub4dos也可使用如下命令： <strong>if exist /COOLG/OEM_NET.CAB &amp;&amp; FAT copy /COOLG/OEM_NET.CAB (fd0)/</strong></span><br>
  <span class="bat">pause</span> <span class="Options">--wait=</span><strong>0 Coping Tools,Please waiting...</strong><br>
  <span class="bat">FAT </span><span class="Options">copy</span><strong> /COOLG/IMG/CLIENT.INI (fd0)/</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;将当前设备/COOLG/IMG/目录下的CLIENT.INI文件复制到第一软驱的根目录下</span><br>
  <span class="bat">map </span><span class="Options">--mem=</span><strong>0xb000 /COOLG/IMG/TOOLS.WIM</strong> <span class="bat">(rd)</span><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;将当前设备/COOLG/IMG/目录下的TOOLS.WIM文件映射到内存22M开始的位置  ,使用(rd)设备是为了加快加载速度<br>
  # &nbsp;&nbsp;&nbsp;<strong>本例中使用了0xb000，转换为10进制为45056，这个值的意思是共45056个扇区，每扇区大小为512B，</strong><br>
  # &nbsp;&nbsp;&nbsp;因1MB=1024KB=1024×1024B，所以45056×512B=23068672B=22528KB=22MB<br>
  # &nbsp;&nbsp;&nbsp;<strong>简单的算法，0xB=11，那么11×2=22，则0xB000=22MB，同理0x1000=1×2=2MB，0x10000=16×2=32MB</strong><br>
  # &nbsp;&nbsp;&nbsp;原理就是0x800=1MB，使用16进制进行计算就能得到是1MB的几倍，即可得到结果</span><br>
  <span class="bat">FAT</span> <span class="Options">copy</span> <strong>(rd)+1 (fd0)/TOOLS.WIM</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;<strong>(rd)+1并非代表rd设备的第一扇区，而是代表整个rd设备，</strong><br>
  # &nbsp;&nbsp;&nbsp;本行命令的作用就是将rd所有内容保存为TOOLS.WIM文件（位于第一软驱）<br>
  # &nbsp;&nbsp;&nbsp;其实使用了这么多命令只有一个目的，就是将当前设备上的TOOLS.WIM文件复制到第一软驱，<br>
  # &nbsp;&nbsp;&nbsp;使用(rd)设备是为了加快加载速度，特别是对于体积较大文件来说</span><br>
  <span class="bat">checkrange</span> <strong>0x21</strong> <span class="bat">read</span> <strong>0x82a0</strong> <span class="Options">&amp;&amp;</span> <span class="bat">pxe keep</span> <span class="Options">&amp;&amp;</span> <span class="bat">goto</span> <strong>1</strong> <span class="Options">!</span> <span class="bat">goto</span><strong> 2</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;检测当前是否为pxe启动，是的话跳转到菜单项1继续执行，不是的话跳转到菜单项2继续执行 <br>
# &nbsp;&nbsp;&nbsp;0x21不明白的点<a href="./GRUB4DOS4设备命名规则.htm">这里</a>，0x82a0不明白的点<a href="./GRUB4DOS5命令索引.htm#read">这里</a>， &amp;&amp; 和 ！ 不明白的点<a href="./GRUB4DOS6其他相关.htm#g">这里</a></span></p>
<p><span class="Options">title</span><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;设置菜单标题为空，想隐藏某项菜单时可以用这个办法 </span><br>
  <span class="bat">cat</span> <span class="Options">--length=</span><strong>0 /COOLG/SERV_SET.BAT</strong><span class="Options"> ||</span> <span class="bat">goto</span> <strong>2</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;检测当前设备/COOLG/目录下是否存在SERV_SET.BAT文件，如果不存在的话就跳转到菜单项2继续执行</span><br>
  <span class="bat">FAT</span> <span class="Options">copy</span> <strong>/COOLG/SERV_SET.BAT (fd0)/</strong><br>
<span class="Notes"># &nbsp;&nbsp;&nbsp;将当前设备/COOLG/目录下的SERV_SET.BAT文件复制到第一软驱的根目录下</span></p>
<p><span class="Notes">##begin##################################################################################################</span><br>
  <span class="bat">set</span> <span class="Options">/a</span> <strong>ip=*0x8288</strong><span class="Options">&amp;</span><strong>0xff</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;内存0x8288处存放的是TFTP服务器的IP地址，16进制存放，本行命令开始将把16进制地址转换为10进制地址<br>
  # &nbsp;&nbsp;&nbsp;(如值是0x3200a8c0换算为10进制地址为192.168.0.50，注意换算时倒序，c0-&gt;192，a8-&gt;168，00-&gt;0，32-&gt;50）<br>
  # &nbsp;&nbsp;&nbsp;<strong>以下都将以0x8288值为0x3200a8c0进行解释说明，不再提示</strong><br>
  # &nbsp;&nbsp;&nbsp;本行命令是<strong>将ip地址和0xff进行按位与（运算符 &amp; ）操作，作用是丢弃高位部分3200a8，留下c0即10进制192
  <br>
  </strong># &nbsp;&nbsp;&nbsp;0xff可以理解成0x000000ff，0&amp;1=0，变量
ip 的值此时为192<br>
# &nbsp;&nbsp;&nbsp;注意：因为<strong>使用了 /a 参数，所以最后结果是10进制 192，如果使用 /A 参数，最终结果将是 c0（依然为16进制）</strong></span></p>
<p><span class="bat">set</span> <span class="Options">/a</span> <strong>a=*0x8288</strong><span class="Options">&gt;&gt;</span><strong>8</strong><span class="Options">&amp;</span><strong>0xff</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;<strong>使用 &gt;&gt; 按位右移运算符，</strong>16进制c0是二进制8位，右移8位后变成0x3200a8，<strong>再按位0xff与操作</strong>，<br>
  #&nbsp;&nbsp;&nbsp;  即丢弃高位部分3200，留下a8即10进制168 ，此时变量 a 的值为 168</span></p>
<p><span class="bat">set</span> <strong>ip=%ip%<span class="Options">.</span>%a%</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;将变量 ip 的值更改为 192.168</span></p>
<p><span class="bat">set</span> <span class="Options">/a</span> <strong>a=*0x8288</strong><span class="Options">&gt;&gt;</span><strong>16</strong><span class="Options">&amp;</span><strong>0xff</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;使用 &gt;&gt; 按位右移运算符，16进制a8c0是二进制16位，右移16位后变成0x3200，再按位0xff与操作，<br>
  # &nbsp;&nbsp;&nbsp;即丢弃高位部分32，留下00即10进制0 ，此时变量 a 的值为 0</span></p>
<p><span class="bat">set</span> <strong>ip=%ip%<span class="Options">.</span>%a%</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;将变量 ip 的值更改为 192.168.0</span></p>
<p><span class="bat">set</span> <span class="Options">/a</span> <strong>a=*0x8288</strong><span class="Options">&gt;&gt;</span><strong>24</strong><span class="Options">&amp;</span><strong>0xff</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;使用 &gt;&gt; 按位右移运算符，16进制00a8c0是二进制24位，右移24位后变成0x32，再按位0xff与操作，<br>
  # &nbsp;&nbsp;&nbsp;现在只需要将0x32转换为10进制就可以了，此时变量 a 的值为 50</span></p>
<p class="Notes"><span class="bat">set</span> <strong>ip=%ip%<span class="Options">.</span>%a%<br>
  </strong><span class="Notes"># &nbsp;&nbsp;&nbsp;将变量 ip 的值更改为 192.168.0.50，至此转换完成，成功将16进制ip地址转换为10进制下的地址</span><br>
##end####################################################################################################</p>
<p><span class="bat">write</span> <span class="Options">--offset</span><strong>=0x100 (fd0)/SERV_SET.BAT \r\nset PXE_SERVER=%ip%\r\n</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;将字符串 \r\nset PXE_SERVER=%ip%\r\n 写入到第一软驱根目录下的SERV_SET.BAT文件中，<br>
  # &nbsp;&nbsp;&nbsp;<strong>跳过前256（0x100）字节</strong>，从第257字节写起，<a href="SERV_SET.BAT.TXT">点此查看 SERV_SET.BAT 实例，</a>写入部分为空白区域<br>
  # &nbsp;&nbsp;&nbsp;注意写入前会将该字符串进行扩展， \<strong>r\n 将扩展为回车换行， %ip% 会扩展为192.168.0.50</strong><br>
  # &nbsp;&nbsp;&nbsp;至此完成获取pxe服务器ip地址，并将该ip地址写入到配置文件中，<a href="SERV_SET.BAT_2.TXT">点此查看替换后的 SERV_SET.BAT 实例</a></span></p>
<p><span class="bat">goto</span> <strong>2</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;跳转到菜单项2继续执行</span></p>
<p><span class="Options">title</span><br>
  <span class="bat">delmod</span><strong> fat</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;删除已经加载到内存中的外部命令fat</span><br>
  <span class="bat">chainloader</span> <span class="Options">--force</span> <strong>/COOLG/IMG/PXEIMG.0</strong><br>
  <span class="Notes"># &nbsp;&nbsp;&nbsp;强制加载当前设备/COOLG/IMG/目录下的PXEIMG.0文件<br>
# &nbsp;&nbsp;&nbsp;题外话：0格式文件是pxe启动专用格式</span><br>
</p>
</body>
</html>
